import Vuex from 'vuex'

/**
 * 如果是服务器环境，则加载 cookieparser 模块
 */
const cookieparser = process.server ? require('cookieparser') : undefined

/**
 * 服务端渲染中的Vuex 容器必须导出一个函数，在函数中返回一个 new 出来的 Vuex 容器
 */
const createStore = () => {
  return new Vuex.Store({
    state: () => ({
      auth: null
    }),
    mutations: {
      setAuth(state, auth) {
        state.auth = auth
      }
    },
    actions: {
      /**
       * nuxtServerInit 是 Nuxt 独有的一个 API
       * 在服务端渲染的时候，Nuxt 会自动调用这个 API 用以初始填充 Vuex 中的数据
       * 注意：该方法只在服务器运行
       */
      nuxtServerInit({ commit }, { req }) {
        let auth = null
        // 如果本次请求有cookies
        if (req.headers.cookie) {
          // 使用 cookieparser 将 cookie 字符串解析为一个对象
          const parsed = cookieparser.parse(req.headers.cookie)

          // 如果Cookie 中没有auth，则不做任何处理
          if (!parsed.auth) return
          try {
            // 如果有，则将 auth 解析放到容器中
            auth = JSON.parse(parsed.auth)
          } catch (err) {
            // 找不到有效的Cookie
          }
        }
        commit('setAuth', auth)
      }
    }
  })
}

export default createStore
